package com.moon.common.dao;

import java.util.List;
import java.util.Map;

import com.moon.common.utils.Page;

/**
 * @author wuxin
 *	use hibernateTemplate & jdbcTemplate
 */
@SuppressWarnings("unchecked")
public interface IBaseDao {

	/**
	 *  save object
	 * @param obj 
	 */
	public void save(Object obj);

	/**
	 *  update object
	 * @param obj
	 */
	public void update(Object obj);

	/**
	 * delete object
	 * @param obj
	 */
	public void delete(Object obj);

	/**
	 * 根据传入的类名和id删除数据库中该对象
	 * @param clazz 类名
	 * @param id 主键id
	 */
	public void deleteById(Class clazz, Long id);

	/**
	 * 保存或更新，如果数据库中存在该则对象更新，不存在保存为一个新对象
	 * @param obj
	 */
	public void saveOrUpdate(Object obj);
	
	/**
	 * 根据传入的sql语句执行sql命令
	 * @param sql
	 */
	public void executeSql(String sql);

	/**
	 * 根据传入的hql语句执行hql命令
	 * @param hql
	 */
	public void executeHql(String hql);
	/**
	 * 根据类名和主键id返回对应对象
	 * @param clazz
	 * @param id
	 * @return
	 */
	public Object findObjectById(Class clazz, Long id);

	/**
	 * 根据hql和传入参数返回该条件的第一个对象
	 * @param hql
	 * @param params
	 * @return
	 */
	public Object findObjectByHql(String hql, Map<String, Object> params);
	
	/**
	 * 根据hql返回对象总数
	 * @param countHql
	 * @return
	 */
	public int getCountByHql(String countHql);

	/**
	 * 根据hql和传入参数返回所有列表
	 * @param hql
	 * @param params
	 * @return
	 */
	public List findListByHql(String hql, Map<String, Object> params);

	/**
	 * 根据hql和传入参数返回分页列表
	 * @param start 开始
	 * @param limit 取多少
	 * @param hql 
	 * @param params
	 * @return
	 */
	public Page findPageByHql(int start, int limit, String hql, Map<String, Object> params);

}
